package com.efast.cafe.portal.service.api.impl;

import java.util.Date;
import java.util.List;
import java.util.UUID;

import com.efast.cafe.framework.exception.ServiceException;
import com.efast.cafe.framework.jdbc.JdbcDao;
import com.efast.cafe.framework.util.SpringWebUtils;
import com.efast.cafe.framework.util.VersionUtil;
import com.efast.cafe.portal.bean.api.ApiSystemDefineBean;
import com.efast.cafe.portal.bean.api.SystemQueryBean;
import com.efast.cafe.portal.dao.api.ApiModuleDefineDao;
import com.efast.cafe.portal.dao.api.ApiSystemDefineDao;
import com.efast.cafe.portal.dao.api.ApiSystemModuleDefDao;
import com.efast.cafe.portal.entity.api.ApiModuleDefine;
import com.efast.cafe.portal.entity.api.ApiSystemDefine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.efast.cafe.portal.service.api.IApiSystemDefineService;
import com.github.pagehelper.PageHelper;

/**
 * <p>
 * Service接口实现类
 * </p>
 * <p>
 * Table: api_system_define - 所属系统定义
 * </p>
 *
 * @since 2017-01-16 06:21:51
 */
@Service
@Transactional
public class ApiSystemDefineServiceImpl implements IApiSystemDefineService {

	private ApiSystemDefineDao apiSystemDefineDao;

	private ApiSystemModuleDefDao apiSystemModuleDefDao;
	
	private ApiModuleDefineDao apiModuleDefineDao;

	@Autowired
	@Qualifier("jdbcDao")
	private JdbcDao jdbcDao;

	
	

	@Autowired
	public void setApiSystemDefineDao(ApiSystemDefineDao apiSystemDefineDao) {
		this.apiSystemDefineDao = apiSystemDefineDao;
	}

	@Autowired
	public void setApiSystemModuleDefDao(ApiSystemModuleDefDao apiSystemModuleDefDao) {
		this.apiSystemModuleDefDao = apiSystemModuleDefDao;
	}
	@Autowired
	public void setApiModuleDefineDao(ApiModuleDefineDao apiModuleDefineDao) {
		this.apiModuleDefineDao = apiModuleDefineDao;
	}

	/**
	 * 根据查询条件查询系统信息，并分页显示
	 */
	@Override
	public SystemQueryBean querySystemDefindPageList(SystemQueryBean queryBean) {
		// 对查询条件修整
		trimQueryBean(queryBean);
		PageHelper.startPage(queryBean.getStart(), queryBean.getLength());
		// 查询结果集
		queryBean.setResultList(apiSystemDefineDao.querySystemListPage(queryBean));
		// 查询总结果集记录
		queryBean.setTotalRows(apiSystemDefineDao.querySystemListPageCount(queryBean));
		return queryBean;
	}

	@Override
	public List<ApiSystemDefineBean> querySystemDefindList(SystemQueryBean queryBean) {
		// 对查询条件修整
		trimQueryBean(queryBean);
		// 查询结果集
		return apiSystemDefineDao.querySystemList(queryBean);
	}

	/**
	 * 新增系统
	 */
	@Override
	public void addNewSystemDefind(ApiSystemDefine apiSystemDefine) {
		// 对输入参数进行修整处理
		trimArgument(apiSystemDefine);
		//如果系统已经存在
		if(apiSystemDefineDao.systemIsExist(apiSystemDefine)>0){
			throw new ServiceException("msg.portal.api.system.path.exist");
		}
		apiSystemDefine.setCreateTime(new Date());
		apiSystemDefine.setCreateUser(SpringWebUtils.getRequestUser());
		apiSystemDefine.setLastUpdateTime(new Date());
		apiSystemDefine.setLastUpdateUser(SpringWebUtils.getRequestUser());
		apiSystemDefine.setIsDel(0);
		apiSystemDefine.setOptCounter(1);
		apiSystemDefine.setSystemStatus(3);
		//如果缺省版本号，则默认为0.0.1版
		if(apiSystemDefine.getSystemVersion()==null||"".equals(apiSystemDefine.getSystemVersion())){
			apiSystemDefine.setSystemVersion("0.0.1");
		}		
		if(apiSystemDefine.getObjId()==null){
			apiSystemDefine.setObjId(UUID.randomUUID().toString());
		}
		apiSystemDefineDao.addNewSystem(apiSystemDefine);
	}

	/**
	 * 根据id更新apiSystemDefine
	 */
	@Override
	public void updateSystemDefind(Integer id, ApiSystemDefine apiSystemDefine,ApiSystemDefineBean systemInfoBean) {
		Integer count=apiSystemDefineDao.systemIsExist(apiSystemDefine);
		   if(count>0){
				throw new ServiceException("msg.portal.api.system.path.exist");
			}
			//先查询原系统信息,查看状态是否变更
		    ApiSystemDefine systemDetail = apiSystemDefineDao.findSystemDetailsById(id);
		    //系统原状态
		    Integer systemStatus=systemDetail.getSystemStatus();
		    //系统状态是否发生变更
		    if(systemStatus!=null && apiSystemDefine.getSystemStatus()!=null
		    		&& systemStatus.intValue()!=apiSystemDefine.getSystemStatus().intValue()){
		    	//判断系统是否有模块
		    	if(apiModuleDefineDao.querylistModuleBySystemId(id).size()==0){
			    	throw new ServiceException("msg.portal.api.system.module.empty");
			    }
		        //当原系统未发布,判断系统状态是否可变
		    	if(systemStatus!=1){
		    		if(apiSystemModuleDefDao.findModuleStatusLtSysStatus(id).size()!=0){
						throw new ServiceException("msg.portal.api.system.change.error");
					}
		    	}
		       //当变更前系统为发布状态,修改系统信息,系统应升版
				if(systemStatus==1){
					if(apiSystemDefine.getSystemStatus()!=3){
						throw new ServiceException("msg.portal.api.module.status.dev");
					}
					apiSystemDefine.setParentId(apiSystemDefine.getId());
					String sysNewVersion = VersionUtil.newVersion(apiSystemDefine.getSystemVersion());
					apiSystemDefine.setSystemVersion(sysNewVersion);
					//产生新版本系统
					addNewSystemDefind(apiSystemDefine);
					//产生新版本系统与原下属所有模块关系
					apiSystemModuleDefDao.copySystemModuleDefList(apiSystemDefine.getParentId(), apiSystemDefine.getId(),SpringWebUtils.getRequestUser());
				}
		    }
			// 对输入参数进行修整处理
			trimArgument(apiSystemDefine);
			apiSystemDefine.setLastUpdateTime(new Date());
			apiSystemDefine.setLastUpdateUser(SpringWebUtils.getRequestUser());
			//修改系统数据
			apiSystemDefineDao.updateSystem(apiSystemDefine);	
		
	}

	/**
	 * 根据id查询apiSystemDefine对应的详细信息，并分页显示
	 */
	@Override
	public ApiSystemDefine querySystemDetailsById(Integer systemId) {
		return apiSystemDefineDao.findSystemDetailsById(systemId);
	}

	/**
	 *
	 * 对新增系统的字段参数修整
	 * 
	 * @param apiSystemDefine
	 */
	private void trimArgument(ApiSystemDefine apiSystemDefine) {
		String sysName = apiSystemDefine.getSystemName();
		String sysPath = apiSystemDefine.getSystemPath();
		String sysRemark = apiSystemDefine.getRemark();
		Integer isDel=apiSystemDefine.getIsDel();
		if(isDel==null){
			apiSystemDefine.setIsDel(0);
		}
		if (sysName != null && !"".equals(sysName)) {
			apiSystemDefine.setSystemName(sysName.trim());
		}
		if (sysPath != null && !"".equals(sysPath)) {
			apiSystemDefine.setSystemPath(sysPath.trim());
		}
		if (sysRemark != null && !"".equals(sysRemark)) {
			apiSystemDefine.setRemark(sysRemark.trim());
		}
	}

	/**
	 *
	 * 对新增系统的字段参数修整
	 * 
	 * @param SystemQueryBean
	 */
	private void trimQueryBean(SystemQueryBean queryBean) {
		String sysName = queryBean.getSystemName();
		String indentifier = queryBean.getIndentifier();
		String systemVersion = queryBean.getSystemVersion();
		if (sysName != null && !"".equals(sysName)) {
			queryBean.setSystemName(sysName.trim());
		}
		if (indentifier != null && !"".equals(indentifier)) {
			queryBean.setIndentifier(indentifier.trim());
		}
		if (systemVersion != null && !"".equals(systemVersion)) {
			queryBean.setSystemVersion(systemVersion.trim());
		}
	}

	/**
	 * 查询除了当前系统之外的系统
	 * {@inheritDoc} 
	 * overridden:
	 * @Date        :      2017年2月7日
	 * @see com.efast.cafe.portal.remote.api.ApiSystemDefineService#findSystemIsNotId(java.lang.Integer)
	 *
	 */
	@Override
	public List<ApiSystemDefineBean> findSystemIsNotId(Integer moduleId) {
		// TODO Auto-generated method stub
		List<ApiSystemDefineBean> liSystemDetailsBeans = apiSystemDefineDao.findSystemIsNotId(moduleId);
		return liSystemDetailsBeans;
	}

	/*系统复用*/
	@Override
	public void reusesSystem(Integer systemId, ApiSystemDefine apiSystemDefine) {
		apiSystemDefine.setCreateTime(new Date());
		apiSystemDefine.setCreateUser(SpringWebUtils.getRequestUser());
		apiSystemDefine.setLastUpdateTime(new Date());
		apiSystemDefine.setLastUpdateUser(SpringWebUtils.getRequestUser());
		apiSystemDefine.setIsDel(0);
		apiSystemDefine.setOptCounter(1);
		apiSystemDefine.setSystemStatus(3);
		//如果缺省版本号，则默认为0.0.1版
		if(apiSystemDefine.getSystemVersion()==null||"".equals(apiSystemDefine.getSystemVersion())){
			apiSystemDefine.setSystemVersion("0.0.1");
		}
		apiSystemDefineDao.addNewSystem(apiSystemDefine);
		
		apiSystemModuleDefDao.reusesSystem(systemId,apiSystemDefine.getId(),SpringWebUtils.getRequestUser());
	}
	
	

}